"""
Agent模块 - 定义与Agent相关的功能和工具
"""

from typing import List, Dict
from langchain_core.messages import BaseMessage
from loguru import logger
from langchain_openai import ChatOpenAI

from ..tools import browser_tools
from ..core.config import settings

# 1. 定义需要人工批准的工具列表
# 在此列表中的工具，执行前需要前端用户点击"批准"
TOOLS_REQUIRING_APPROVAL = [
    "click",
]

# 2. 定义所有可用工具
all_tools = [
    browser_tools.navigate_to_url,
    browser_tools.click,
]

# 创建一个从工具名称到工具对象的映射，方便查找
tool_map = {tool.name: tool for tool in all_tools}

# 分离需要批准和可自动执行的工具
manual_approval_tools = [tool for tool in all_tools if tool.name in TOOLS_REQUIRING_APPROVAL]
auto_executable_tools = [tool for tool in all_tools if tool.name not in TOOLS_REQUIRING_APPROVAL]

# 3. 创建LLM和绑定工具的模型
def create_agent_model():
    """创建并返回绑定了工具的LLM模型"""
    llm = ChatOpenAI(
        model=settings.OPENAI_MODEL,
        api_key=settings.OPENAI_API_KEY,
        base_url=settings.OPENAI_BASE_URL,
        temperature=0.2,
        streaming=True,
    )
    # 绑定所有工具到模型，让模型知道它可以调用哪些工具
    return llm.bind_tools(all_tools)

# 4. Agent节点函数
def agent_node(state: Dict):
    """Agent节点：调用LLM决定下一步行动"""
    model = create_agent_model()
    response = model.invoke(state["messages"])
    return {"messages": [response]}

# 5. 工具路由逻辑
def route_tools(state: Dict) -> str:
    """根据工具是否需要批准来决定下一个节点"""
    from langgraph.graph import END
    
    last_message = state["messages"][-1]
    
    if not last_message.tool_calls:
        return END

    for tool_call in last_message.tool_calls:
        if tool_call["name"] in TOOLS_REQUIRING_APPROVAL:
            return "tools_for_approval"
    
    return "tools_for_auto_execution"

# 6. 辅助函数
def get_tool_nodes():
    """返回工具节点，可在工作流中使用"""
    from langgraph.prebuilt import ToolNode
    return ToolNode(all_tools) 